home *** CD-ROM | disk | FTP | other *** search
/ Kit PC World De Ampliacion De Windows 95 / Kit PC World de ampliacion de Windows 95.iso / clarion / gauge / gauge.z / DSIEVE.PAS < prev    next >
Pascal/Delphi Source File  |  1995-08-24  |  3KB  |  104 lines

  1. unit Dsieve;
  2.  
  3. interface
  4.  
  5. uses
  6.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  7.   Forms, Dialogs, StdCtrls, Clipbrd, DdeMan;
  8.  
  9. const
  10.   Cycles            = 2000;                      {Number of cycles}
  11.   ArraySize         = 1000;                      {Array size}
  12.  
  13. type
  14.   TSieve = class(TForm)
  15.     Label1: TLabel;
  16.     Run: TButton;
  17.     Exit: TButton;
  18.     Label2: TLabel;
  19.     CyclesPerMinute: TLabel;
  20.     DdeServerItem1: TDdeServerItem;
  21.     DPSIEVE: TDdeServerConv;
  22.     procedure RunClick(Sender: TObject);
  23.     procedure ExitClick(Sender: TObject);
  24.     procedure DDEOpen(Sender: TObject);
  25.  
  26.   private
  27.     { Private declarations }
  28.   public
  29.     { Public declarations }
  30.   end;
  31.  
  32. var
  33.   Sieve:      TSieve;
  34.   Start:      LongInt;
  35.   Stop:       LongInt;
  36.   CycsPerMin: Real;
  37.  
  38. procedure RunSieve;
  39.  
  40. implementation
  41.  
  42. {$R *.DFM}
  43.  
  44. procedure TSieve.RunClick(Sender: TObject);
  45. begin
  46.   Start := GetTickCount;
  47.   Run.Enabled := False;
  48.   Exit.Enabled := False;
  49.   Screen.Cursor := crHourglass;
  50.   RunSieve;
  51.   Stop := GetTickCount;
  52.   CycsPerMin := Cycles * 60000 / (Stop - Start);
  53.   CyclesPerMinute.Caption := Format( '%10.0n',[CycsPerMin]);
  54.   ClipBoard.Clear;
  55.   ClipBoard.AsText := Format( '%10f',[CycsPerMin]);
  56.   Run.Enabled := True;
  57.   Exit.Enabled := True;
  58.   Screen.Cursor := crDefault;
  59. end;
  60.  
  61. procedure TSieve.ExitClick(Sender: TObject);
  62. begin
  63.   Sieve.Close;
  64. end;
  65.  
  66. procedure RunSieve;
  67. var
  68.   Flag:             Array[1..ArraySize] of Byte; {Array of flags}
  69.   Prime:            Integer;                     {Next prime}
  70.   I:                Integer;                     {Loop counter}
  71.   K:                Integer;                     {Step size}
  72.   Cycle:            Integer;                     {Cycle number}
  73.   Count:            Integer;                     {Number of primes}
  74.  
  75. Begin
  76.   For Cycle := 1 to Cycles Do                    {Do multiple iterations}
  77.     Begin
  78.     Count := 0;                                  {Clear prime counter}
  79.     For I := 1 To ArraySize Do Flag[I] := 1;     {Clear array}
  80.     For I := 1 To ArraySize Do                   {Sift out the non-primes}
  81.       Begin
  82.       IF Flag[I] = 1 Then                        {For flags that are on}
  83.         Begin
  84.         Prime := I + I + 1;                      {  Set the next prime}
  85.         K := I + Prime;                          {  Set step count}
  86.         While K <= ArraySize Do                  {  Loop through remainder}
  87.           Begin
  88.           Flag[K] := 0;                          {    Turning off flags}
  89.           K := K + Prime;                        {    Jump to next step}
  90.           End;
  91.         Count := Count + 1;
  92.         End;                                      {  Increment prime counter}
  93.       End;                                       {  End the IF}
  94.     End;                                         {End the outside LOOP}
  95. End;
  96.  
  97. procedure TSieve.DDEOpen(Sender: TObject);
  98. begin
  99.   Sieve.RunClick(Sender);
  100.   Sieve.ExitClick(Sender);
  101. end;
  102.  
  103. End.
  104.